﻿/**
 * Copyright "Nobz"
 * "contributeur : G. Qyy"
 * (06/2010) 
 * 
 * alienscorp9@gmail.com
 * 
 * Ce logiciel est un programme informatique servant à démontrer l'usage des différentes possibilité de C#. 
 * 
 * Ce logiciel est régi par la licence CeCILL-B soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL-B telle que diffusée par le CEA, le CNRS et l'INRIA 
 * sur le site "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.txt".
 * 
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 * 
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant 
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à 
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement, 
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. 
 * 
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
 * pris connaissance de la licence CeCILL-B, et que vous en avez accepté les
 * termes.
 **/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using GestionComptes.Class;
using System.Runtime.Serialization;
// Note: When building this code, you must reference the
// System.Runtime.Serialization.Formatters.Soap.dll assembly
using System.Runtime.Serialization.Formatters.Soap;


namespace GestionComptes
{
    public partial class FenetrePrincipale : Form
    {
        protected FenetreBanques choisirBanque;

        public FenetrePrincipale()
        {
            InitializeComponent();
            majAffichage();

            choisirBanque = new FenetreBanques();

            // DOC : Automatically Fill a ComboBox with an Enum - http://www.jmsoftware.co.uk/blog/automatically-fill-a-combobox-with-an-enum
            // This is a really nice little feature.
            // If we have an enumerator, say:
            // public enum MyEnumerator { Oranges, Apples, Hedgehogs, Laptops, Budgies, Other }
            // Having a form with a ComboBox called comboBox1, put this in the constructor/form load etc:
            // this.comboBox1.DataSource = Enum.GetValues(typeof(MyEnumerator));
            // This fills the combobox with the values. To convert the current combobox value back into the enumerator’s value:
            // MyEnumerator selected = (MyEnumerator)this.comboBox1.SelectedValue;

            cbxTypeEcriture.DataSource = Enum.GetValues(typeof(Ecriture.TypesEcritureEnum));
            cbxNatureOperation.DataSource = Enum.GetValues(typeof(Ecriture.NatureOperationEnum));

        }

        #region Evenements

        private void btnAjouteCompte_Click(object sender, EventArgs e)
        {
            // DOC: try-catch - http://msdn.microsoft.com/fr-fr/library/0yd65esw.aspx
            try
            {
                cbxListeCompte.Items.Add(new Compte(tbxAjouteCompte.Text));
                tbxAjouteCompte.Text = String.Empty;
            }
            catch (ArgumentException ex)
            {
                MessageBox.Show(ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // Penser à réattacher l'évenement dans le SelectedIndexChanged de la cbxListeCompte
        //private void cbxListeCompte_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    // HACK: techinque de debuging Utiliser un point d'arret (F9) pour voire pourquoi ça fait planter
        //    MessageBox.Show(((Compte)cbxListeCompte.SelectedValue).NomCompte);
        //}

        private void cbxListeCompte_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {
                //MessageBox.Show(((Compte)cbxListeCompte.SelectedItem).NomCompte);
                selectedCompte = (Compte)cbxListeCompte.SelectedItem;
                dgvEcritures.DataSource = selectedCompte.Ecritures;
                majAffichage();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnChoisirBanque_Click(object sender, EventArgs e)
        {

            try
            {
                choisirBanque.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            if (choisirBanque.SelectedBanque != null)
            {
                selectedCompte.LaBanque = choisirBanque.SelectedBanque;
                majAffichage();
            }

        }

        private void btnAjouteEcriture_Click(object sender, EventArgs e)
        {
            try
            {
                if ((Ecriture.TypesEcritureEnum)cbxTypeEcriture.SelectedItem == Ecriture.TypesEcritureEnum.Credit)
                {
                    selectedCompte.AjouteEcriture(new Credit(
                                                        dtpDateEcriture.Value,
                                                        Convert.ToDouble(tbxValeurEcriture.Text),
                                                        (Ecriture.NatureOperationEnum)cbxNatureOperation.SelectedItem,
                                                        tbxLibelleEcriture.Text
                                                        ));
                    majAffichage();
                }
                else if ((Ecriture.TypesEcritureEnum)cbxTypeEcriture.SelectedItem == Ecriture.TypesEcritureEnum.Debit)
                {
                    selectedCompte.AjouteEcriture(new Debit(
                                                        dtpDateEcriture.Value,
                                                        Convert.ToDouble(tbxValeurEcriture.Text),
                                                        (Ecriture.NatureOperationEnum)cbxNatureOperation.SelectedItem,
                                                        tbxLibelleEcriture.Text
                                                        ));
                    majAffichage();
                }
                else
                {
                    throw new Exception("Le type d'écriture est inconnu !");
                }
            }
            catch (FormatException ex)
            {
                MessageBox.Show("Le format de la valeur n'est probablement pas bon : "
                                    + tbxValeurEcriture.Text
                                    + Environment.NewLine
                                    + "La valeur doit être au format 0,00"
                                    + Environment.NewLine + Environment.NewLine
                                    + "Message système : " + ex.Message,
                                "Erreur !",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error
                                );
            }
            catch (ArgumentException ex)
            {
                MessageBox.Show("La valeur ne doit pas être à 0 !"
                       + Environment.NewLine + Environment.NewLine
                       + "Message système : " + ex.Message,
                   "Erreur !",
                   MessageBoxButtons.OK,
                   MessageBoxIcon.Error
                   );
            }
        }

        #endregion

        #region Propriété

        protected Compte selectedCompte
        {
            get;
            set;
        }

        #endregion

        #region Méthodes

        private void majAffichage()
        {
            if (selectedCompte != null)
            {

                gbxDetailCompte.Visible = true;

                if (selectedCompte.LaBanque != null)
                {
                    lblNomBanque.Text = selectedCompte.LaBanque.NomBanque;
                }
                else
                {
                    lblNomBanque.Text = "Aucune banque n'est associée à ce compte";
                }

                    lblTotalCredit.Text = "...";
                    lblTotalDebit.Text = "...";
                    lblSolde.Text = "...";

                if (selectedCompte.Ecritures.Count > 0)
                {
                    Double credit = 0.0;
                    Double debit = 0.0;
                    Double solde = 0.0;

                    // DOC: LINQ SumSimple - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumSimple
                    if (selectedCompte.Credits.Count > 0)
                    {
                        credit = selectedCompte.Credits.Sum(credits => credits.ValeurEcriture);
                    }
                    if (selectedCompte.Credits.Count > 0)
                    {
                        debit = selectedCompte.Debits.Sum(debits => debits.ValeurEcriture);
                    }

                    solde = credit + debit;

                    lblTotalCredit.Text = credit.ToString();
                    lblTotalDebit.Text = debit.ToString();
                    lblSolde.Text = solde.ToString();
                }

            }
            else
            {
                gbxDetailCompte.Visible = false;
            }
        }

        #endregion

        // DOC Serialization - http://www.supinfo-projects.com/fr/2005/serialisation_deserialisation_uk/3/
        private void button1_Click(object sender, EventArgs e)
        {
            SoapFormatter sf = new SoapFormatter();
            FileStream fs = new FileStream(@"f:\test.xml", FileMode.OpenOrCreate);
            sf.Serialize(fs, selectedCompte);
            fs.Close();
        }

    }
}
